package com.nohgun.bike.pass;

import java.util.List;


import com.google.android.maps.MapActivity;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

import com.nohgun.bike.R;
import com.nohgun.bike.database.DBHelper;


import android.R.integer;
import android.content.Context;

import android.database.sqlite.SQLiteDatabase;
import android.graphics.drawable.Drawable;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationListener;
import android.os.Bundle;
import android.util.Log;


public class PassInfActivity extends MapActivity {

    protected DBHelper dbhelper;

    private SQLiteDatabase db;

    MapView mapView;

    Drawable drawable;//마커로 그림 그릴때 불러오기 위한 클래스

    List<Overlay> list; //마커 위에 마커가 올라갈 수도 있게 때문에 list 타입으로 선언

    HellowOverlay helloOverlay; //맵에 컬렉션 타입으로 구성
    
    LocationListener LocationListener;
    LocationManager  lm;
    Location   location;
    
    String     bestProvider;
    String     provider; 

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pass_inf);

        mapView = (MapView) findViewById(R.id.mapview2);
        mapView.setBuiltInZoomControls(true);

        //mapView.setSatellite(true);
        
        
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
       
        
      
        
        //프로바이더 중에 설정한 조건에 적합한 것을 가져온다. - 이 소스는 이부분을 사용했다
        Log.d("###debug::PassInfActivity::1###","##############");
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_COARSE); // 정확도
        criteria.setPowerRequirement(Criteria.POWER_LOW); // 전원 소리량
        criteria.setAltitudeRequired(false); // 고도
        criteria.setBearingRequired(false); // ..
        criteria.setSpeedRequired(false); // 속도
        criteria.setCostAllowed(true); // 금전적 비용
        Log.d("###debug::PassInfActivity::2###","##############");
        //두번째 파라미터를 true 로 해야 활성화된 프로바이더를 가져온다.
        bestProvider = lm.getBestProvider(criteria, true);
        Log.d("###debug::PassInfActivity::3###",bestProvider);
        location =  lm.getLastKnownLocation(bestProvider);
        Log.d("###debug::PassInfActivity::4###",bestProvider);
        
        if(location != null){
          //위도 / 경도 / 고도
        	Log.d("###debug::PassInfActivity::location###","##############");
            Log.d("###debug::PassInfActivity::getLatitude###",String.valueOf(location .getLatitude()));
            Log.d("###debug::PassInfActivity::getLongitude###",String.valueOf(location .getLongitude()));
            Log.d("###debug::PassInfActivity::getAltitude###",String.valueOf(location .getAltitude()));
            
            GeoPoint p = new GeoPoint((int)location.getLatitude() *1000000, (int)location.getLongitude() *1000000); //위도하고 경도값을 지정함

            MapController mc = mapView.getController(); //실제좌표값을 맵뷰에 출력, 좌표값이 바뀌면 바뀐 위치를 화면에 출력
            mc.animateTo(p); // animateTo() 메소드에 매개변수로 받는다. 이곳으로 지도의 중심으로 가게 한다.

            mc.setZoom(16); //1~21 숫자가 클수록 정밀하게 표시 

            list = mapView.getOverlays(); //현재 맵에 등록된 레이어 목록을 추출해서 리스트로 참조한다.

            drawable = this.getResources().getDrawable(R.drawable.ic_launcher); //맵에 중심에 꽂아줄 이미지 생성

            if(helloOverlay ==null){
            	helloOverlay = new HellowOverlay(drawable); //생성한 이미지를 HelloOverlay에 넣고 객체값을 받는다.
            }

            OverlayItem overlayItem = new OverlayItem(p, "", ""); // OverlayItem 클래스에 지도의 위.경도 값을 받은 객체 하나를 생성한다.

            helloOverlay.addOverlay(overlayItem); // 이를 받아서 helloOverlay에 추가한다. 넣게되면 list에 추가하게 되고 다추가하고 난 뒤에 populate해서 그려준다.

            list.add(helloOverlay); //리스트에 추가한다. googleMap.java에 추가.
            
            Log.d("###debug::PassInfActivity::list.size()###",String.valueOf(list.size()));
            
        }
        
        //이동시 현재 위치업데이트를 위한 리스너 구현
        
        LocationListener  =  new DispLocListener();
        Log.d("###debug::PassInfActivity::5###",bestProvider);
        //30초 단위, 10.0f 거리 이동 시  위치를 업데이트 한다. 
        lm.requestLocationUpdates(bestProvider, 10000, 10, LocationListener);
        Log.d("###debug::PassInfActivity::6###",bestProvider);
        /*
        http://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&ie=utf8&query=%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C+LOCATION_SERVICE+AndroidManifest&x=0&y=0
        //화면에 위도와 경도와 고도를 표시한다.
        textview_Latitude     = (TextView)findViewById(R.id.latitude);
        textview_Longitude  = (TextView)findViewById(R.id.longitude);
        textview_Atitude       = (TextView)findViewById(R.id.atitude);
        
        if(location != null){
            //위도 / 경도 / 고도
            textview_Latitude.setText    (Double.toString(location .getLatitude()));
            textview_Longitude.setText (Double.toString(location .getLongitude()));;
            textview_Atitude.setText      (Double.toString(location .getAltitude()));;
        }
        
        //이동시 현재 위치업데이트를 위한 리스너 구현
        LocationListener = new DispLocListener();
        //30초 단위, 10.0f 거리 이동 시  위치를 업데이트 한다. 
        lm.requestLocationUpdates(bestProvider, 30000L, 10.0f, LocationListener);
        
        

                
        //GPSProvider gps = new GPSProvider(mlocManager);
        
        //double longitude = gps.getLongitude(); //이건 아시죠?^^
        //double latitude = gps.getLatitude();
        
        Log.d("###debug::PassInfActivity::longitude###",String.valueOf(longitude));
        Log.d("###debug::PassInfActivity::latitude###",String.valueOf(latitude));
        */
        /*
        < 두 GPS location간의 거리 구하는 방법 >
        ...
        float[] distance = new float[2]; // float 형태의 사이즈 2의 행렬 생성
        float actual_distance; //실제 거리 값을 담을 변수
         
        Location.distanceBetween(lat1, lon1, lat2, lon2, distance);
        //lat1와 lon1은 첫번째 사용자, lat2와 lon2는 두번째 사용자의 GPS 값.
        //distanceBetween은 Location클래스 내에서 정의된 static 함수이기 때문에 Location 클래스를 통해 아무데서나 부를 수 있다.
        //이 메소드가 호출되고 나면 distance 행렬의 첫번째 요소로 두 지점의 거리가 할당된다.
        actual_distance = distance[0]; //간단한 사용을 위해 일반 변수로 넘겨주기.
        
        

        GeoPoint p = new GeoPoint(37556447, 126945184); //위도하고 경도값을 지정함

        MapController mc = mapView.getController(); //실제좌표값을 맵뷰에 출력, 좌표값이 바뀌면 바뀐 위치를 화면에 출력
        mc.animateTo(p); // animateTo() 메소드에 매개변수로 받는다. 이곳으로 지도의 중심으로 가게 한다.

        mc.setZoom(18); //1~21 숫자가 클수록 정밀하게 표시

        list = mapView.getOverlays(); //현재 맵에 등록된 레이어 목록을 추출해서 리스트로 참조한다.

        drawable = this.getResources().getDrawable(R.drawable.ic_launcher); //맵에 중심에 꽂아줄 이미지 생성

        helloOverlay = new HellowOverlay(drawable); //생성한 이미지를 HelloOverlay에 넣고 객체값을 받는다.

        OverlayItem overlayItem = new OverlayItem(p, "", ""); // OverlayItem 클래스에 지도의 위.경도 값을 받은 객체 하나를 생성한다.

        helloOverlay.addOverlay(overlayItem); // 이를 받아서 helloOverlay에 추가한다. 넣게되면 list에 추가하게 되고 다추가하고 난 뒤에 populate해서 그려준다.

        list.add(helloOverlay); //리스트에 추가한다. googleMap.java에 추가.
        */
    }

    protected boolean isRouteDisplayed() {
        return false;
    }
  //액티비티가 중지 되었을 경우
    public void onPause(){
     super.onPause();
     
     //현재 위치 업데이트 중지
     lm.removeUpdates(LocationListener);
    }
    
    //액티비티가 다시 활성화 되었을 경우 
    public void onResume(){
     super.onResume();
     
     //현재 위치 업데이트 활성화
     lm.requestLocationUpdates(bestProvider, 10000, 10, LocationListener);
    }
 
     //현재 위치 업데이트를 위한 리스너
     public class DispLocListener implements LocationListener{

           //위치가 변했을 경우에 실행하는 메소드만 구현하고 나머지는 놔두자
           public void onLocationChanged(Location location) {
                 //현재 위치를 다시 표시한다.
                 //위도 / 경도 / 고도
        		Log.d("###debug::PassInfActivity::location2###","##############");
                Log.d("###debug::PassInfActivity::getLatitude###",String.valueOf(location.getLatitude()));
                Log.d("###debug::PassInfActivity::getLongitude###",String.valueOf(location.getLongitude()));
                Log.d("###debug::PassInfActivity::getAltitude###",String.valueOf(location.getAltitude()));
                
                GeoPoint p = new GeoPoint((int)location.getLatitude() *1000000, (int)location.getLongitude() *1000000); //위도하고 경도값을 지정함

                MapController mc = mapView.getController(); //실제좌표값을 맵뷰에 출력, 좌표값이 바뀌면 바뀐 위치를 화면에 출력
                mc.animateTo(p); // animateTo() 메소드에 매개변수로 받는다. 이곳으로 지도의 중심으로 가게 한다.

                mc.setZoom(16); //1~21 숫자가 클수록 정밀하게 표시 

                list = mapView.getOverlays(); //현재 맵에 등록된 레이어 목록을 추출해서 리스트로 참조한다.

                drawable = getApplication().getResources().getDrawable(R.drawable.ic_launcher); //맵에 중심에 꽂아줄 이미지 생성
                
                if(helloOverlay ==null){
                	helloOverlay = new HellowOverlay(drawable); //생성한 이미지를 HelloOverlay에 넣고 객체값을 받는다.
                }

                OverlayItem overlayItem = new OverlayItem(p, "", ""); // OverlayItem 클래스에 지도의 위.경도 값을 받은 객체 하나를 생성한다.

                helloOverlay.addOverlay(overlayItem); // 이를 받아서 helloOverlay에 추가한다. 넣게되면 list에 추가하게 되고 다추가하고 난 뒤에 populate해서 그려준다.

                list.add(helloOverlay); //리스트에 추가한다. googleMap.java에 추가.
                
                Log.d("###debug::PassInfActivity::list.size()###",String.valueOf(list.size()));
                
           }
 

           public void onProviderDisabled(String provider) {
                  // TODO Auto-generated method stub
    
            }

            public void onProviderEnabled(String provider) {
                 // TODO Auto-generated method stub
   
            }

            public void onStatusChanged(String provider, int status, Bundle extras) {
                 // TODO Auto-generated method stub
   
            }
      }
}
